package github.sf.fw.tools.db.catalog.doris;

import github.sf.fw.tools.db.catalog.TableModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 在 Doris 中，数据以表（Table）的形式进行逻辑上的描述。 一张表包括行（Row）和列（Column）。Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。
 * Column 可以分为两大类：Key 和 Value。从业务角度看，Key 和 Value 可以分别对应维度列和指标列。
 * Doris的key列是建表语句中指定的列，建表语句中的关键字'unique key'或'aggregate key'或'duplicate key'后面的列就是 Key 列，除了 Key 列剩下的就是 Value 列。
 *
 * @author zhoup
 * @since 2023/7/26
 */
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Data
public class DorisTableModel extends TableModel {

    private DorisDataModel dorisDataModel;

    private DistributedModel distributedModel;
    /**
     * 属性
     */
    private Map<String, String> properties = new LinkedHashMap<>();

    public DorisTableModel() {
        properties.put("replication_allocation", "tag.location.default: 1");
    }

    @Override
    public String getFragment() {
        List<String> remainPrimaryKeys = primaryKeys;
        this.primaryKeys = null;
        String fragment = super.getFragment();
        fragment = fragment.substring(0, fragment.length() - 1);
        StringBuilder result = new StringBuilder(fragment);
        String modelFragment = dorisDataModel.getFragment();
        result.append("\n");
        if (modelFragment != null && !modelFragment.isEmpty()) {
            result.append(modelFragment);
        }
        String distributedModelFragment = distributedModel.getFragment();
        if (distributedModelFragment == null || distributedModelFragment.isEmpty()) {
            throw new IllegalStateException(tableName + "表创建语句有误");
        }
        result.append("\n");
        result.append(distributedModelFragment);
        result.append("\n");
        if (!properties.isEmpty()) {
            result.append("PROPERTIES (\n");
            properties.forEach((k, v) -> {
                result.append("  \"").append(k).append("\"").append("=").append("\"").append(v).append("\"").append("\n");
            });
            result.append(")");
        }
        return result.append(";").toString();
    }
}
